# Created with PyCharm.
# Coding UTF-8
# @Version Python 3.8

# @author GeekChunky
# @Email caiyoupeng00@outlook.com

# @Date 2021/12/11
# @CreatTime 17:31

# Now Write Down Your Python Code in Editor...
# Wish You Happy Everyday !

print('程序加载中...请稍后...')

# 在C:\Users\caiyo\AppData\Roaming\Python\Python38\site-packages\selenium\webdriver\common\service.py中修改代码以关闭日志输出

# 剪贴板操作
import clipboard
# 导入By模块
from selenium.webdriver.common.by import By
# 导入选择器模块
from selenium.webdriver.support.select import Select
# 导入暂停模块
from time import sleep
# 导入datetime模块
from datetime import timedelta, date
# 导入警示模块
from warnings import simplefilter
# 导入系统控件
from sys import exit
# 导入raw_input
from pip._vendor.distlib.compat import raw_input
# 导入异常
from selenium.common.exceptions import WebDriverException, NoSuchElementException
# 导入浏览器组件
from selenium import webdriver

# 固定数据
startTime = str(date.today())
account = 'softtest2018'
password = 'aaa'
text = None
driver = None

print('\n******欢迎来到软件测试资产管理实训系统自动化程序******\n')

while True:
    choose_broswer = input('请输入你需要运行的浏览器：\n1.Chrome\n2.Edge\n3.FireFox\n4.退出\n\n请输入：')

    if choose_broswer == '1':
        try:
            # 开始Chrome设置
            options = webdriver.ChromeOptions()
            # 浏览器静默运行
            options.add_argument("headless")
            options.add_argument("disable-gpu")
            # 启动驱动
            driver = webdriver.Chrome(options=options)
            # driver = webdriver.Chrome()
            break
        except WebDriverException:
            sleep(1)
            print('\nError:' + str(WebDriverException))
            print('系统没有找到相应的浏览器（驱动），检查浏览器驱动是否添加至环境变量')
            sleep(1)
            print('\n为您重启程序...\n')
            sleep(2)
            print('\n******欢迎来到软件测试资产管理实训系统自动化程序******\n')
        finally:
            pass
    elif choose_broswer == '2':
        try:
            # 开始Edge设置
            options = webdriver.EdgeOptions()
            # 使用谷歌内核
            options.use_chromium = True
            options.add_argument("--headless")
            # 谷歌文档提到需要加上这个属性来规避bug
            options.add_argument("disable-gpu")
            driver = webdriver.Edge(options=options)
            break
        except WebDriverException:
            sleep(1)
            print('\nError:' + str(WebDriverException))
            print('系统没有找到相应的浏览器（驱动），检查浏览器驱动是否添加至环境变量')
            sleep(1)
            print('\n为您重启程序...\n')
            sleep(2)
            print('\n******欢迎来到软件测试资产管理实训系统自动化程序******\n')
        finally:
            pass
    elif choose_broswer == '3':
        try:
            options = webdriver.FirefoxOptions()
            options.add_argument('--headless')
            driver = webdriver.Firefox(options=options)
            break
        except WebDriverException:
            sleep(1)
            print('\nError:' + str(WebDriverException))
            print('系统没有找到相应的浏览器（驱动），检查浏览器驱动是否添加至环境变量')
            sleep(1)
            print('\n为您重启程序...\n')
            sleep(2)
            print('\n******欢迎来到软件测试资产管理实训系统自动化程序******\n')
        finally:
            pass
    elif choose_broswer == '4':
        print('Byebye~')
        sleep(1)
        exit()
    else:
        print('输入错误！请重新输入！')
        sleep(1)


def Connect():
    print('\n正在与服务器建立连接...')
    try:
        driver.get('http://192.168.1.251')
    except WebDriverException:
        print('\n连接失败...')
        print('Error:' + str(WebDriverException))
        sleep(1)
        print('请检查服务器连接并重新尝试，系统将在3s后自动退出...')
        driver.quit()
        sleep(3)
        exit()
    finally:
        pass


Connect()
print('建立连接成功！\n')
sleep(2)


# 新建任务ID
def newTaskID():
    try:
        driver.refresh()
        sleep(1)
        driver.get('http://192.168.1.251')
        driver.implicitly_wait(10)
        sleep(1)
        # 输入用户名
        driver.find_element(By.XPATH, '//*[@id="loginName"]').send_keys(account)
        # 输入密码
        driver.find_element(By.XPATH, '//*[@id="pwd"]').send_keys(password)
        # 添加暂停时间1s
        sleep(1)
        # 点击登录
        driver.find_element(By.XPATH, '//*[@id="fmedit"]/div/div[5]/input').click()
        # 添加暂停时间1s
        sleep(1)
        # 点击任务列表菜单栏
        driver.find_element(By.XPATH, '//*[@id="tabmenu_task"]/a').click()
        # 点击新增任务按钮
        driver.find_element(By.CSS_SELECTOR,
                            'body > div.border_bg_withbtn > div.content_bg > div.add_submit > div > input').click()
        # 输入任务名称
        driver.find_element(By.CSS_SELECTOR, '#task_title').send_keys(taskName)
        # 软件名称下拉框选择器选择
        Select(driver.find_element(By.CSS_SELECTOR, '#softId')).select_by_visible_text('资产管理系统软件(B/S和安卓)')
        # 添加暂停时间1s
        sleep(1)
        # 任务种类下拉框选择器选择
        Select(driver.find_element(By.CSS_SELECTOR, '#taskTypeId')).select_by_visible_text('B/S结构功能测试')
        # 勾选分配班级
        driver.find_element(By.XPATH, '//*[@id="fmedit"]/table/tbody/tr[4]/td[2]/div/input[1]').click()
        driver.find_element(By.XPATH, '//*[@id="fmedit"]/table/tbody/tr[4]/td[2]/div/input[2]').click()
        driver.find_element(By.XPATH, '//*[@id="fmedit"]/table/tbody/tr[4]/td[2]/div/input[3]').click()
        # 输入开始时间
        driver.find_element(By.XPATH, '//*[@id="beginDate"]').send_keys(startTime)
        # 输入结束时间
        driver.find_element(By.XPATH, '//*[@id="endDate"]').send_keys(overTime)
        # 定位到该iframe框架
        element = driver.find_element(By.XPATH, '//*[@id="cke_1_contents"]/iframe')
        # 跳入iframe框架
        driver.switch_to.frame(element)
        # 添加任务需求
        driver.find_element(By.XPATH, '/html/body').send_keys(taskNeed)
        # 跳回最外层页面
        driver.switch_to.default_content()
        # 点击确定按钮
        driver.find_element(By.XPATH, '//*[@id="btnok"]').click()
        # 添加暂停时间3s
        sleep(3)
        # 点击确定按钮关闭弹窗
        driver.find_element(By.XPATH, '//*[@id="popCloseBtn"]').click()
        # 获取最新的任务ID
        global text
        text = driver.find_elements(By.TAG_NAME, 'td')[1].text
        # 复制到剪贴板
        clipboard.copy(text)
        print('任务ID已自动获取至剪贴板')
        sleep(1)
        # 生成完成
        print('\n生成完毕\n本次生成的任务ID为：' + text + '\n生成的任务ID仅供当天使用')
        print('如无需初始化数据，即可使用xg02用户登录')
    except WebDriverException or NoSuchElementException:
        driver.quit()
        print('服务器中断！什么垃圾吊毛服务器，别把我做宝搞！我不干了！')
        sleep(2)
        exit()
    finally:
        pass


# 跳转程序
def skipProgram():
    print()
    print('跳转中...\n')
    sleep(1)


# 退出程序
def KillProgram():
    driver.quit()
    print()
    overProgram = raw_input('按回车键退出...')
    exit()


# 登录系统
def checkIn():
    # 输入用户名
    driver.find_element(By.XPATH, '//*[@id="loginName"]').send_keys('xg01')
    # 输入密码
    driver.find_element(By.XPATH, '//*[@id="password"]').send_keys('xg01')
    # 输入验证码
    driver.find_element(By.XPATH, '//*[@id="vericode"]').send_keys('shtd')
    # 点击登录
    driver.find_element(By.XPATH, '//*[@id="fmedit"]/div[2]/div[6]/input').click()


# 返回功能
def back():
    backProgram = raw_input('按回车键返回菜单...')
    print()


rows_zclb = [('资产数据01', 'Test01'), ('资产数据02', 'Test02'), ('资产数据03', 'Test03')]
rows_pinpai = [('品牌数据01', 'Test01'), ('品牌数据02', 'Test02'), ('品牌数据03', 'Test03')]
rows_baofei = [('报废数据01', 'Test01'), ('报废数据02', 'Test02'), ('报废数据03', 'Test03')]
rows_bumen = [('部门数据01', 'Test01'), ('部门数据02', 'Test02'), ('部门数据03', 'Test03')]
rows = [rows_zclb, rows_pinpai, rows_baofei, rows_bumen]
ways = ["资产类别", "品牌", "报废方式", "部门管理"]


def add_way(attr, name, num):
    sleep(1)
    # 点击菜单栏
    driver.find_element(By.LINK_TEXT, attr).click()
    sleep(1)
    # 点击新增
    driver.find_element(By.XPATH, 'html/body/div[2]/div/div[2]/div[2]/div[1]/div/input').click()
    sleep(1)
    # 输入名称
    driver.find_element(By.XPATH, '//*[@id="title"]').send_keys(name)
    # sleep(1)
    # 输入编码
    driver.find_element(By.XPATH, '//*[@id="code"]').send_keys(num)
    # sleep(1)
    # 点击确定
    driver.find_element(By.XPATH, '//*[@id="cboxLoadedContent"]/div/div[3]/a[2]').click()
    # 等待弹窗1s
    sleep(2)
    # 确定弹窗
    simplefilter('ignore', DeprecationWarning)
    # TODO:标黄
    driver.switch_to.alert.accept()


while True:
    print('********************主菜单*********************\n')
    print('1.显示当前所有可用任务ID')
    print('2.生成任务ID')
    print('3.全自动生成一个新任务ID并注入数据（仅供当天使用）')
    print('4.全自动生成任务ID（仅供当天使用）')
    print('5.为任务ID注入数据')
    print('6.任务ID数据清理')
    print('7.实训管理平台文件上传')
    print('8.退出系统')
    print('9.关于')
    print()

    function = input('请输入你需要运行的功能：')
    print()

    if function == '':
        print('系统未接受到指令！请重新输入！')
        pass
    elif function == '1':
        print('开始查询...')
        sleep(1)

        try:
            driver.refresh()
            sleep(2)
            driver.get('http://192.168.1.251')
        except WebDriverException:
            driver.quit()
            print('服务器中断！什么垃圾吊毛服务器，别把我做宝搞！我不干了！')
            sleep(2)
            exit()
        finally:
            sleep(2)
            pass


        # 定义方法处理定位异常
        def catch_exception(way, value):

            try:
                ele = driver.find_element(way, value)
            except:
                ele = None
            else:
                return ele


        # ？？？
        def way_op(value_list):
            if value_list[2] == 'click':
                ele = catch_exception(value_list[0], value_list[1])
                if ele is not None:
                    ele.click()
                else:
                    print("定位不到该元素")
            elif value_list[2] == 'send_keys':
                ele = catch_exception(value_list[0], value_list[1])
                if ele is not None:
                    ele.send_keys(value_list[3])
                else:
                    print("定位不到该元素")


        login_Name = [By.XPATH, '//*[@id="loginName"]', "send_keys", "softtest2018"]
        pwd_Name = [By.XPATH, '//*[@id="pwd"]', "send_keys", "aaa"]
        btn_Name = [By.XPATH, '//*[@id="fmedit"]/div/div[5]/input', "click"]
        way_op(login_Name)
        way_op(pwd_Name)
        way_op(btn_Name)
        taskIDs = []
        types = []
        date_times = []

        # 开始查找任务ID
        number = 2
        for j in range(2, 17):
            id = driver.find_element(By.XPATH,
                                     '/html/body/div[2]/div[3]/div[3]/table/tbody/tr[' + str(j) + ']/td[2]').text
            type = driver.find_element(By.XPATH,
                                       '/html/body/div[2]/div[3]/div[3]/table/tbody/tr[' + str(j) + ']/td[6]').text
            date_time = driver.find_element(By.XPATH,
                                            '/ html / body / div[2] / div[3] / div[3] / table / tbody / tr[' + str(
                                                j) + ']/td[5]').text
            if id not in taskIDs and type == '正常':
                taskIDs.append(id)
                types.append(type)
                date_times.append(date_time)
        print(" " + "-" * 32)
        print("|        已查到条" + str(len(types)) + "正常ID记录         |")
        print(" " + "-" * 32)
        print("|   任务ID  |  状态  |  任务结束时间 |")
        for i in range(len(types)):
            print(" " + "-" * 32)
            print(end="|\t")
            info_list = [taskIDs[i], types[i], date_times[i]]
            for item in info_list:
                print(item, end="  |  ")
            print()
        print(" " + "-" * 32)
        sleep(1)
        print('\n查询完毕\n')
        back()
    elif function == '2':
        skipProgram()
        # 提示输入任务名称
        while True:
            taskName = input('请输入任务名称：')
            if taskName != '':
                break
            print('任务名称必填！请重新输入！')
        # 提示留存天数
        while True:
            adjust_days = input('请输入你要留存此任务ID的天数：')
            if adjust_days.isdigit():
                need_days = int(adjust_days)
                break
            print('输入有误！请重新输入！')
        # 计算结束时间
        overTime = date.today() + timedelta(need_days)
        overTime = str(overTime)
        # 任务要求
        taskNeed = taskName + 'CreatedFromPythonSeleniumScript'
        # 提示信息
        print('\n接受成功！正在获取其他相关数据...')
        sleep(1)
        print('已就绪...\n开始生成...')
        # 新建任务ID
        newTaskID()
        # 杀死进程
        KillProgram()
    elif function == '3':
        # 提示输入任务名称
        taskName = 'AutoTaskWithData'
        # 计算结束时间
        overTime = str(date.today())
        # 任务要求
        taskNeed = taskName + 'CreatedFromPythonSeleniumScript'
        # 提示语句
        sleep(1)
        print('\n接受成功！正在获取其他相关数据...')
        sleep(1)
        print('已就绪...\n开始生成...')
        newTaskID()

        sleep(1)
        print('\n开始注入数据...\n预计时间：15s\n')
        # 载入新标签页
        driver.execute_script("window.open('');")
        # 操作转至新标签页
        driver.switch_to.window(driver.window_handles[1])

        try:
            # Get系统
            driver.refresh()
            sleep(1)
            driver.get('http://192.168.1.251/bsams')
        except WebDriverException:
            driver.quit()
            print('服务器中断！什么垃圾吊毛服务器，别把我做宝搞！我不干了！')
            sleep(2)
            exit()
        finally:
            pass

        # 将获取到剪贴版的任务ID输入输入框
        driver.find_element(By.XPATH, '//*[@id="taskId"]').send_keys(text)
        # 登录
        checkIn()

        # 注入数据
        for item in range(len(rows)):
            attr = ways[item]
            for i in rows[item]:
                add_way(attr, i[0], i[1])

        # 在控制台中输出任务ID
        print('数据注入成功...')

        KillProgram()
    elif function == '4':
        skipProgram()
        # 任务名称
        taskName = 'QucikTask'
        # 计算结束时间
        overTime = str(date.today())
        # 任务要求
        taskNeed = taskName + 'CreatedFromPythonSeleniumScript'
        # 提示语句
        print('开始生成...')
        newTaskID()
        KillProgram()
    elif function == '5':
        # 跳转功能
        skipProgram()

        ID = input('请输入要注入数据的任务ID：')
        sleep(1)
        print('正在测试任务ID可用性...')

        try:
            driver.refresh()
            sleep(1)
            driver.get('http://192.168.1.251/bsams')
        except WebDriverException:
            print('服务器中断！什么垃圾吊毛服务器，别把我做宝搞！我不干了！')
            sleep(2)
            exit()
        finally:
            pass

        try:
            # 将获取到剪贴版的任务ID输入输入框
            driver.find_element(By.XPATH, '//*[@id="taskId"]').send_keys(ID)
        except NoSuchElementException:
            print('任务ID不可用')
        finally:
            pass

        print('任务ID正常可用\n')
        # 登录
        checkIn()

        print('即将注入数据...\n建议：数据注入完成后再登录\n注入数据预计用时：20s\n注入中...')

        # 添加数据
        for item in range(len(rows)):
            attr = ways[item]
            for i in rows[item]:
                add_way(attr, i[0], i[1])

        # 注入完成
        print('\n注入成功！')

        # 退出程序
        KillProgram()

    elif function == '6':
        skipProgram()
        print('功能正在开发中，敬请期待...')
        print('为您自动返回菜单\n')
        sleep(1)
    elif function == '7':
        skipProgram()
        print('功能正在开发中，敬请期待...')
        print('为您自动返回菜单\n')
        sleep(1)
    elif function == '8':
        print('Bye~')
        sleep(1)
        exit()
    elif function == '9':
        skipProgram()
        print('@关于本程序')
        print('2017四和天地资产管理实训系统自动化工具（V5.3）')
        print('Bug反馈：842093229（QQ）')
        sleep(1)
        print('制作人：@GeekChunky , @dfs')
        sleep(1)
        print(
            'This automation plug-in is based on \"WebDriver\" configured \"Google Cores\" and \"Gecko Cores\" browser.\n')
        sleep(1)
        print(
            '本工具调用的模块有：\n'
            '+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'
            '+                     clipboard                       +\n'
            '+                  selenium.webdriver                 +\n'
            '+            selenium.webdriver.common.by             +\n'
            '+         selenium.webdriver.support.select           +\n'
            '+                     time.sleep                      +\n'
            '+             datetime.timedelta,date                 +\n'
            '+              warnings.simplefilter                  +\n'
            '+                     sys.exit                        +\n'
            '+        pip._vendor.distlib.compat.raw_input         +\n'
            '+    selenium.common.exceptions.WebDriverException    +\n'
            '+  selenium.common.exceptions.NoSuchElementException  +\n'
            '+                    pyinstaller                      +\n'
            '+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'
        )
        sleep(3)
        print('版本日志：\n')
        sleep(1)
        print('V1.0：\n'
              '\tddt注入数据功能实现')
        sleep(1)
        print('V1.1：\n'
              '\t自动生成任务ID功能实现')
        sleep(1)
        print('V2.0：\n'
              '\t自动生成任务ID+ddt注入数据功能实现')
        sleep(1)
        print('V2.1：\n'
              '\t自动生成任务ID+ddt注入多数据功能实现')
        sleep(1)
        print('V2.2：\n'
              '\t1.自动生成任务ID+ddt注入多数据功能实现\n'
              '\t2.代码优化')
        sleep(1)
        print('V3.0：\n'
              '\t功能整合')
        sleep(1)
        print('V3.1：\n'
              '\t1.代码优化\n'
              '\t2.多个功能的实现')
        sleep(1)
        print('V3.5：\n'
              '\t弃用unittest，ddt数据驱动')
        sleep(1)
        print('V3.6：\n'
              '\tWebdriver工具改用msedge驱动')
        sleep(1)
        print('V3.7：\n'
              '\t实现浏览器禁默化运行')
        sleep(1)
        print('V3.8：\n'
              '\t完善程序逻辑，加入多种方法')
        sleep(1)
        print('V3.9：\n'
              '\t完善业务逻辑')
        sleep(1)
        print('V4.0：\n'
              '\t代码优化')
        sleep(1)
        print('V4.1：\n'
              '\t增加启动程序时进行服务器连接验证功能')
        sleep(1)
        print('V4.5：\n'
              '\t整合三大浏览器')
        sleep(1)
        print('V5.0：')
        sleep(1)
        print('\t1.弃用Selenium3，弃用msedge_selenium_tools')
        sleep(1)
        print('\t2.实现查看任务ID功能')
        sleep(1)
        print('V5.1：')
        sleep(1)
        print('\t1.修复Chrome浏览器无法使用的错误')
        sleep(1)
        print('\t2.修复更新日志的排版错误')
        sleep(1)
        print('V5.2：')
        sleep(1)
        print('\t1.修复Chrome浏览器下无法查看任务ID的错误')
        sleep(1)
        print('\t2.修复使用Chrome、FireFox浏览器存在警示信息的问题')
        sleep(1)
        print('\t3.为浏览器选择块添加多个异常处理保证程序的稳定运行')
        sleep(1)
        print('\t4.优化版本日志的显示效果')
        sleep(1)
        print('\t5.优化功能结束返回主菜单的设计')
        sleep(1)
        print('\t6.优化了程序内存管理机制')
        sleep(1)
        print('\t7.解决了程序运行时服务器不稳定的现象')
        sleep(1)
        print('\t8.弃用switch_to_alert()语法')
        sleep(1)
        print('\t9.弃用find_element_by_*()语法')
        sleep(1)
        print('\t10.修复了一些bug...')
        sleep(1)
        print('V5.3：')
        print('\t1.修复了Chrome、Firefox浏览器仍旧无法使用的问题')
        sleep(1)
        print('\t2.修复浏览器日志文件显示的异常')
        sleep(1)
        print('\t3.为应用程序添加图标')
        # TODO:整理TODO、整理get类代码
        sleep(1)
        print('\n输出完毕...')
        sleep(2)
        back()
    else:
        print('输入错误，请重新输入！')
        pass
